package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.entity.SysCodeType;
import com.augurit.common.syscode.convert.SysCodeConverter;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.util.lang.StringUtils;

/**
 * 业务字典类型DAO类
 */
@Repository
public class SysCodeTypeDao extends BaseDao<SysCodeType, Long> {
	
	@Autowired
	private SysCodeItemDao sysCodeItemDao; //系统词组子表DAO类

	
	/**
	 * 根据主键ID集合删除多个业务字典类型对象
	 * @param ids 业务字典类型主键ID集合
	 * @return 被删除的类型对象的类型编号列表
	 */
	public List<String> deleteByTypeIds(Long... typeIds) {
		if(typeIds != null){
			List<String> list = new ArrayList();
			
			for(Long typeId : typeIds){
				SysCodeType entity = this.get(typeId);
				
				//保存被删除的类型对象的类型编号
				String typeCode = entity.getCode();
				list.add(typeCode);

				//删除关联子项列表
				sysCodeItemDao.deleteByTypeCode(typeCode);
				
				//删除类型
				this.delete(entity);
			}
			
			return list;
		}
		return null;
	}
	
	/**
	 * 删除业务字典类型及所有业务字典项
	 * @param typeCode 业务字典类型编号
	 */
	public void deleteByTypeCode(String typeCode){
		//删除关联子项列表
		sysCodeItemDao.deleteByTypeCode(typeCode);
		
		//删除业务字典类型对象
		SysCodeType entity = getByTypeCode(typeCode);
		if(entity != null)
			this.delete(entity);
	}
	
	/**
	 * 根据业务字典类型编号获取业务字典类型对象
	 * @param typeCode 业务字典类型编号
	 * @return 业务字典类型对象
	 */
	public SysCodeType getByTypeCode(String typeCode){
		if(StringUtils.isNotBlank(typeCode))
			return this.findUniqueBy("code", typeCode);
		else
			return null;
	}
	
	/**
	 * 根据业务字典类型编号获取业务字典类型名称
	 * @param typeCode 业务字典类型编号
	 * @return 业务字典类型名称
	 */
	public String getTypeName(String typeCode){
		String result = "";

		SysCodeType entity = getByTypeCode(typeCode);
		if(entity != null)
			result = entity.getName();
		
		return result;
	}
	
	/**
	 * 保存业务字典类型Form对象
	 * @param form 业务字典类型Form对象
	 */
	public void save(SysCodeForm form){
		if(form != null){
			SysCodeType entity = null;
			
			//准备VO对象
			if(form != null && form.getTypeId() != null && form.getTypeId() != 0L){
				entity = this.get(form.getTypeId());
				//如业务字典类型编号变更则需要更新所有业务字典项的业务字典类型编号
				sysCodeItemDao.updateTypeCode(entity.getCode(), form.getTypeCode());
			}else{
				//建立新业务字典类型
				entity = new SysCodeType();
				//额外建立一个默认的业务字典项
				sysCodeItemDao.add(form.getTypeCode(), 2);
			}
			
			//属性值转换
			SysCodeConverter.convert(form, entity);
			
			//保存
			this.save(entity);
			
			//回填ID属性值
			form.setTypeId(entity.getId());
		}
	}

}
